# Copyright (c) Stanford University, The Regents of the University of
#               California, and others.
#
# All Rights Reserved.
#
# See Copyright-SimVascular.txt for additional details.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject
# to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import os
import vtk
import sv

def mesh_polydata(fn, args, fns_out=None):
    """
    Use SimVascular to mesh a file containing a VTK PolyData and write the volumetric mesh to disk
    Args:
        fn: file name of the VTK PolyData
        args: meshing options, dic
        fns_out: file names of the output mesh (poly_fn, ug_fn)
    Returns:
        return (surface, volumetric)
    """    

    mesher = sv.meshing.TetGen()
    mesher.load_model(fn)
    mesher.set_walls([1])
    face_ids = mesher.get_model_face_ids()
    options = sv.meshing.TetGenOptions(**args)
    options.no_merge = True
    options.no_bisect = True
    options.optimization = 3
    options.quality_ratio = 1.4
    mesher.generate_mesh(options)
    volumetric = mesher.get_mesh()
    surface = mesher.get_surface()
    return (surface, volumetric)

def remesh_polydata(poly, hmin, hmax,write_fn=None):
    """
    Use SimVascular MMG remesh to remesh a surfac mesh
    
    Args:
        poly: input polydata
        hmin: min edge size
        hmax: max edge size
        write: output filename 
    Returns:
        remeshed: remeshed polydata
    """
    remeshed = sv.mesh_utils.remesh(poly, hmin=hmin, hmax=hmax)
    if write_fn is not None:
        write_vtk_polydata(remeshed, write_fn)
    return remeshed

